#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string.h>
#include <math.h>

class FunkcjaCustomowa
{
public:
	double Funkcja(double yn);
	double PochodnaFunkcji(double yn);
	double oszacowanieBledu(double epsilon);
};

double FunkcjaCustomowa::Funkcja(double yn)
{
	return cos(20.0f * yn)-1.5f;
}

double FunkcjaCustomowa::PochodnaFunkcji(double yn)
{
	return (20.0f * -sin(20.0f * yn));
}

double FunkcjaCustomowa::oszacowanieBledu(double epsilon)
{
    double h = 1.0f/8.0f;
    double error;
    
    do {
        error = 0.0f;
        
        for(double t = 0.0f ; t <= 1.0f ; t += h) {
        
            double fullStep = h * PochodnaFunkcji(t + (h / 2.0f));
            double halfStep = (h / 2.0f) * PochodnaFunkcji(t + (h / 4.0f));
            double secondHalfStep = (h / 2.0f) * PochodnaFunkcji(t + (3.0 * h / 4.0f));
            error += fabs(fullStep - (halfStep + secondHalfStep));
        }
        
        h = h / 2.0f;
        
    } while(error > epsilon && h > 0.00000001);
    
	return h;
}

int main(int argc, char *argv[])
{
	const int N = 30;
	double x0, epsilon, x[N+1], h;

	FunkcjaCustomowa f;
	x[0] = -0.5f;
	h = 1.0f/(double)(N);
	
	//printf("%lf\n", 1.0f / f.oszacowanieBledu(0.000000000001));
	
	for(int i = 0; i< N; i++)
	{
		x[i+1] = x[i] + h * f.PochodnaFunkcji((double)(i * h + (h/2)));
		printf("%lf,%lf,%lf\n",(double)i/N, x[i], f.Funkcja((double)i/N));
	}
}
